package model

import "time"

// User 用户模型
type User struct {
	ID        uint       `gorm:"primaryKey" json:"id"`
	Username  string     `gorm:"size:50;uniqueIndex;not null" json:"username"`
	Password  string     `gorm:"size:255;not null" json:"-"` // 不返回密码
	Email     string     `gorm:"size:100;uniqueIndex" json:"email"`
	Phone     string     `gorm:"size:20;uniqueIndex" json:"phone"`
	Nickname  string     `gorm:"size:100;index:idx_nickname" json:"nickname"` // 添加索引：按昵称搜索
	Avatar    string     `gorm:"size:255" json:"avatar"`
	RoleID    uint       `gorm:"not null;default:3;index:idx_role_id" json:"roleId"` // 添加索引：按角色查询用户
	Status    int        `gorm:"default:1;index:idx_status" json:"status"` // 添加索引：筛选用户状态
	LastLogin *time.Time `json:"lastLogin"`
	CreatedAt time.Time  `gorm:"index:idx_created_at" json:"createdAt"` // 添加索引：按创建时间排序
	UpdatedAt time.Time  `json:"updatedAt"`
}

// Role 角色模型
type Role struct {
	ID          uint      `gorm:"primaryKey" json:"id"`
	Name        string    `gorm:"size:50;uniqueIndex;not null" json:"name"`
	Code        string    `gorm:"size:50;uniqueIndex;not null" json:"code"` // admin, coach, member
	Description string    `gorm:"size:200" json:"description"`
	Status      int       `gorm:"default:1" json:"status"`
	CreatedAt   time.Time `json:"createdAt"`
	UpdatedAt   time.Time `json:"updatedAt"`
}

// Permission 权限模型
type Permission struct {
	ID          uint      `gorm:"primaryKey" json:"id"`
	Name        string    `gorm:"size:50;not null" json:"name"`
	Code        string    `gorm:"size:100;uniqueIndex;not null" json:"code"` // member:create
	Resource    string    `gorm:"size:50" json:"resource"`                   // member
	Action      string    `gorm:"size:50" json:"action"`                     // create, read, update, delete
	Description string    `gorm:"size:200" json:"description"`
	CreatedAt   time.Time `json:"createdAt"`
	UpdatedAt   time.Time `json:"updatedAt"`
}

// RolePermission 角色权限关联表
type RolePermission struct {
	ID           uint      `gorm:"primaryKey" json:"id"`
	RoleID       uint      `gorm:"not null;index" json:"roleId"`
	PermissionID uint      `gorm:"not null;index" json:"permissionId"`
	CreatedAt    time.Time `json:"createdAt"`
}

// 请求和响应结构

type RegisterReq struct {
	Username string `json:"username" binding:"required,min=3,max=50"`
	Password string `json:"password" binding:"required,min=8,max=32"`
	Email    string `json:"email" binding:"required,email"`
	Phone    string `json:"phone" binding:"required"`
	Nickname string `json:"nickname"`
}

type LoginReq struct {
	Username string `json:"username" binding:"required"`
	Password string `json:"password" binding:"required"`
}

type LoginResp struct {
	AccessToken  string    `json:"accessToken"`  // 访问令牌
	RefreshToken string    `json:"refreshToken"` // 刷新令牌
	User         *UserInfo `json:"user"`
	ExpiresAt    time.Time `json:"expiresAt"` // AccessToken过期时间
}

type UserInfo struct {
	ID        uint       `json:"id"`
	Username  string     `json:"username"`
	Email     string     `json:"email"`
	Phone     string     `json:"phone"`
	Nickname  string     `json:"nickname"`
	Avatar    string     `json:"avatar"`
	Role      string     `json:"role"`
	RoleID    uint       `json:"roleId"`
	LastLogin *time.Time `json:"lastLogin"` // 添加LastLogin字段
}

type ChangePasswordReq struct {
	OldPassword string `json:"oldPassword" binding:"required"`
	NewPassword string `json:"newPassword" binding:"required,min=8,max=32"`
}

type UpdateProfileReq struct {
	Nickname string `json:"nickname"`
	Email    string `json:"email"`
	Phone    string `json:"phone"`
	Avatar   string `json:"avatar"`
}

// RefreshTokenReq 刷新Token请求
type RefreshTokenReq struct {
	RefreshToken string `json:"refreshToken" binding:"required"`
}

// RefreshTokenResp 刷新Token响应
type RefreshTokenResp struct {
	AccessToken  string    `json:"accessToken"`
	RefreshToken string    `json:"refreshToken"`
	ExpiresAt    time.Time `json:"expiresAt"`
}

// ====================
// 用户管理相关结构
// ====================

// UserListReq 用户列表请求
type UserListReq struct {
	Page     int    `form:"page"`
	PageSize int    `form:"pageSize"`
	Role     string `form:"role"`    // admin, coach, member
	Status   *int   `form:"status"`  // 0:禁用 1:启用 (使用指针允许空值)
	Keyword  string `form:"keyword"` // 搜索用户名/邮箱/手机号
}

// UserListItem 用户列表项
type UserListItem struct {
	ID        uint       `json:"id"`
	Username  string     `json:"username"`
	Email     string     `json:"email"`
	Phone     string     `json:"phone"`
	Nickname  string     `json:"nickname"`
	Avatar    string     `json:"avatar"`
	RoleID    uint       `json:"roleId"`
	RoleName  string     `json:"roleName"`
	Status    int        `json:"status"`
	LastLogin *time.Time `json:"lastLogin"`
	CreatedAt time.Time  `json:"createdAt"`
}

// UserDetailResp 用户详情响应
type UserDetailResp struct {
	ID        uint       `json:"id"`
	Username  string     `json:"username"`
	Email     string     `json:"email"`
	Phone     string     `json:"phone"`
	Nickname  string     `json:"nickname"`
	Avatar    string     `json:"avatar"`
	RoleID    uint       `json:"roleId"`
	RoleName  string     `json:"roleName"`
	Status    int        `json:"status"`
	LastLogin *time.Time `json:"lastLogin"`
	CreatedAt time.Time  `json:"createdAt"`
	UpdatedAt time.Time  `json:"updatedAt"`
}

// UpdateUserReq 管理员更新用户信息请求
type UpdateUserReq struct {
	Nickname string `json:"nickname"`
	Email    string `json:"email"`
	Phone    string `json:"phone"`
}

// UpdateUserStatusReq 更新用户状态请求
type UpdateUserStatusReq struct {
	Status int `json:"status" binding:"required,oneof=0 1"` // 0:禁用 1:启用
}

// UpdateUserRoleReq 修改用户角色请求
type UpdateUserRoleReq struct {
	RoleID uint `json:"roleId" binding:"required,min=1"` // 角色ID：1-管理员 2-教练 3-普通用户
}

// ====================
// 权限管理相关结构
// ====================

// PermissionCreateReq 创建权限请求
type PermissionCreateReq struct {
	Name        string `json:"name" binding:"required"`
	Code        string `json:"code" binding:"required"`     // 权限代码，如: member:create
	Resource    string `json:"resource" binding:"required"` // 资源名，如: member
	Action      string `json:"action" binding:"required"`   // 操作，如: create, read, update, delete
	Description string `json:"description"`
}

// AssignPermissionsReq 分配权限请求
type AssignPermissionsReq struct {
	PermissionIDs []uint `json:"permissionIds" binding:"required,min=1"` // 权限ID列表
}
